/*
题目：队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值，要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。

若队列为空，pop_front 和 max_value 需要返回 -1
https://leetcode.cn/problems/dui-lie-de-zui-da-zhi-lcof/
 */
public class Offer59B {
    Queue<Integer> queue = new LinkedList<> ();
    Deque<Integer> maxDeque = new LinkedList<> ();//用于储存最大值

    public MaxQueue() {}

    public int max_value() {
        if (queue.isEmpty()) {
            return -1;
        }
        return maxDeque.peekFirst();
    }

    public void push_back(int value) {
        queue.offer(value);
        if (maxDeque.isEmpty() || maxDeque.peekLast() >= value) {
            maxDeque.offerLast(value);
        } else {
            while (!maxDeque.isEmpty() && maxDeque.peekLast() < value) {
                maxDeque.pollLast();
            }
            maxDeque.offer(value);
        }
    }

    public int pop_front() {
        if (queue.isEmpty()) {
            return -1;
        }
        int tmp = queue.poll();
        if (tmp == maxDeque.peek()) {
            maxDeque.poll();
        }
        return tmp;
    }
}
